package demo4;

import java.util.Arrays;

/**
 * 2024/6/10 模拟ArrayList集合工具类 Cjj 16:42
 * @param <E>
 */
public class MyArrayList<E> {
    private Object[] elementData = {};
    private int size; //记录元素个数，记录下个位置

    private int DEFAULT_CAPACITY = 10;

    /**开发add()方法, 用于添加数据 遵循ArrayList的扩容机制**/
    public boolean add(E e) {
        //1.判断是否需要扩容
        if (size == elementData.length) {
            grow();
        }
        elementData[size++] = e;
        return true;
    }

    /**开发根据索引查询数据的get()方法**/
    public E get(int index) {
        //做越界判断
        checkIndex(index);
        //根据索引提取数据
        return (E) elementData[index];
    }

    /**开发根据索引删除数据的remove方法**/
    public E remove(int index){
        checkIndex(index);
        E e= (E) elementData[index];
        //删除数据应该要考虑是否需要进行元素位移操作。
         int moveFlag=size-index-1;
         if(moveFlag!=0){
             //把数据进行移位操作
           System.arraycopy(elementData,
                   index+1,elementData,index,moveFlag);
         }
         //把当前最后一个数据改成null
        elementData[--size]=null;
         return e;
    }

    /**获取集合大小的size()方法**/
    public int size(){
        return size;
    }


    /**开发forEach方法**/
    public void forEach(MyConsumer<E> action){
        for (int i = 0; i <size; i++) {
          action.accept((E)elementData[i]);
        }
    }
    public void checkIndex(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException(index + "out if max length" + size);
        }
    }

    private void grow() {
        if (size == 0) {
            elementData = new Object[DEFAULT_CAPACITY];
        } else {
            //后几次扩容
            elementData = Arrays.copyOf(elementData, elementData.length >> 1);
        }
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        for (int i = 0; i < size; i++) {
            E e=(E)elementData[i];
            stringBuilder.append(e).append(i==size-1?"":",");
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }
}
